{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Stacked LSTMs for Time Series Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We'll now build a slightly deeper model by stacking two LSTM layers using the Quandl stock price data (see the stacked_lstm_with_feature_embeddings notebook for implementation details). Furthermore, we will include features that are not sequential in nature, namely indicator variables for identifying the equity and the month."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:00.862779Z",
     "start_time": "2020-06-22T00:45:00.860288Z"
    }
   },
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:02.425802Z",
     "start_time": "2020-06-22T00:45:00.864803Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "from pathlib import Path\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from scipy.stats import spearmanr\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\n",
    "from tensorflow.keras.models import Sequential, Model\n",
    "from tensorflow.keras.layers import Dense, LSTM, Input, concatenate, Embedding, Reshape, BatchNormalization\n",
    "import tensorflow.keras.backend as K\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.ticker import FuncFormatter\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:02.453244Z",
     "start_time": "2020-06-22T00:45:02.426860Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using GPU\n"
     ]
    }
   ],
   "source": [
    "gpu_devices = tf.config.experimental.list_physical_devices('GPU')\n",
    "if gpu_devices:\n",
    "    print('Using GPU')\n",
    "    tf.config.experimental.set_memory_growth(gpu_devices[0], True)\n",
    "else:\n",
    "    print('Using CPU')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:02.468717Z",
     "start_time": "2020-06-22T00:45:02.455241Z"
    }
   },
   "outputs": [],
   "source": [
    "idx = pd.IndexSlice\n",
    "sns.set_style('whitegrid')\n",
    "np.random.seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:02.477404Z",
     "start_time": "2020-06-22T00:45:02.470351Z"
    }
   },
   "outputs": [],
   "source": [
    "results_path = Path('results', 'lstm_embeddings')\n",
    "if not results_path.exists():\n",
    "    results_path.mkdir(parents=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Data produced by the notebook [build_dataset](00_build_dataset.ipynb)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:03.229210Z",
     "start_time": "2020-06-22T00:45:02.478733Z"
    }
   },
   "outputs": [],
   "source": [
    "data = pd.read_hdf('data.h5', 'returns_weekly').drop('label', axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:03.281252Z",
     "start_time": "2020-06-22T00:45:03.231195Z"
    }
   },
   "outputs": [],
   "source": [
    "data['ticker'] = pd.factorize(data.index.get_level_values('ticker'))[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:03.593536Z",
     "start_time": "2020-06-22T00:45:03.282860Z"
    }
   },
   "outputs": [],
   "source": [
    "data['month'] = data.index.get_level_values('date').month\n",
    "data = pd.get_dummies(data, columns=['month'], prefix='month')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:03.768616Z",
     "start_time": "2020-06-22T00:45:03.594861Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "MultiIndex: 1167341 entries, ('A', Timestamp('2009-01-11 00:00:00')) to ('ZUMZ', Timestamp('2017-12-31 00:00:00'))\n",
      "Data columns (total 66 columns):\n",
      " #   Column       Non-Null Count    Dtype  \n",
      "---  ------       --------------    -----  \n",
      " 0   fwd_returns  1167341 non-null  float64\n",
      " 1   1            1167341 non-null  float64\n",
      " 2   2            1167341 non-null  float64\n",
      " 3   3            1167341 non-null  float64\n",
      " 4   4            1167341 non-null  float64\n",
      " 5   5            1167341 non-null  float64\n",
      " 6   6            1167341 non-null  float64\n",
      " 7   7            1167341 non-null  float64\n",
      " 8   8            1167341 non-null  float64\n",
      " 9   9            1167341 non-null  float64\n",
      " 10  10           1167341 non-null  float64\n",
      " 11  11           1167341 non-null  float64\n",
      " 12  12           1167341 non-null  float64\n",
      " 13  13           1167341 non-null  float64\n",
      " 14  14           1167341 non-null  float64\n",
      " 15  15           1167341 non-null  float64\n",
      " 16  16           1167341 non-null  float64\n",
      " 17  17           1167341 non-null  float64\n",
      " 18  18           1167341 non-null  float64\n",
      " 19  19           1167341 non-null  float64\n",
      " 20  20           1167341 non-null  float64\n",
      " 21  21           1167341 non-null  float64\n",
      " 22  22           1167341 non-null  float64\n",
      " 23  23           1167341 non-null  float64\n",
      " 24  24           1167341 non-null  float64\n",
      " 25  25           1167341 non-null  float64\n",
      " 26  26           1167341 non-null  float64\n",
      " 27  27           1167341 non-null  float64\n",
      " 28  28           1167341 non-null  float64\n",
      " 29  29           1167341 non-null  float64\n",
      " 30  30           1167341 non-null  float64\n",
      " 31  31           1167341 non-null  float64\n",
      " 32  32           1167341 non-null  float64\n",
      " 33  33           1167341 non-null  float64\n",
      " 34  34           1167341 non-null  float64\n",
      " 35  35           1167341 non-null  float64\n",
      " 36  36           1167341 non-null  float64\n",
      " 37  37           1167341 non-null  float64\n",
      " 38  38           1167341 non-null  float64\n",
      " 39  39           1167341 non-null  float64\n",
      " 40  40           1167341 non-null  float64\n",
      " 41  41           1167341 non-null  float64\n",
      " 42  42           1167341 non-null  float64\n",
      " 43  43           1167341 non-null  float64\n",
      " 44  44           1167341 non-null  float64\n",
      " 45  45           1167341 non-null  float64\n",
      " 46  46           1167341 non-null  float64\n",
      " 47  47           1167341 non-null  float64\n",
      " 48  48           1167341 non-null  float64\n",
      " 49  49           1167341 non-null  float64\n",
      " 50  50           1167341 non-null  float64\n",
      " 51  51           1167341 non-null  float64\n",
      " 52  52           1167341 non-null  float64\n",
      " 53  ticker       1167341 non-null  int64  \n",
      " 54  month_1      1167341 non-null  uint8  \n",
      " 55  month_2      1167341 non-null  uint8  \n",
      " 56  month_3      1167341 non-null  uint8  \n",
      " 57  month_4      1167341 non-null  uint8  \n",
      " 58  month_5      1167341 non-null  uint8  \n",
      " 59  month_6      1167341 non-null  uint8  \n",
      " 60  month_7      1167341 non-null  uint8  \n",
      " 61  month_8      1167341 non-null  uint8  \n",
      " 62  month_9      1167341 non-null  uint8  \n",
      " 63  month_10     1167341 non-null  uint8  \n",
      " 64  month_11     1167341 non-null  uint8  \n",
      " 65  month_12     1167341 non-null  uint8  \n",
      "dtypes: float64(53), int64(1), uint8(12)\n",
      "memory usage: 498.9+ MB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train-test split\n",
    "\n",
    "To respect the time series nature of the data, we set aside the data at the end of the sample as hold-out or test set. More specifically, we'll use the data for 2017."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:03.777115Z",
     "start_time": "2020-06-22T00:45:03.769984Z"
    }
   },
   "outputs": [],
   "source": [
    "window_size=52\n",
    "sequence = list(range(1, window_size+1))\n",
    "ticker = 1\n",
    "months = 12\n",
    "n_tickers = data.ticker.nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:04.099004Z",
     "start_time": "2020-06-22T00:45:03.778162Z"
    }
   },
   "outputs": [],
   "source": [
    "train_data = data.loc[idx[:, :'2016'], :]\n",
    "test_data = data.loc[idx[:, '2017'],:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For each train and test dataset, we generate a list with three input arrays containing the return series, the stock ticker (converted to integer values), and the month (as an integer), as shown here:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:04.195678Z",
     "start_time": "2020-06-22T00:45:04.100279Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([(1035424, 52, 1), (1035424,), (1035424, 12)], (1035424,))"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train = [\n",
    "    train_data.loc[:, sequence].values.reshape(-1, window_size , 1),\n",
    "    train_data.ticker,\n",
    "    train_data.filter(like='month')\n",
    "]\n",
    "y_train = train_data.fwd_returns\n",
    "[x.shape for x in X_train], y_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:04.219196Z",
     "start_time": "2020-06-22T00:45:04.197014Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([(131917, 52, 1), (131917,), (131917, 12)], (131917,))"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# keep the last year for testing\n",
    "X_test = [\n",
    "    test_data.loc[:, list(range(1, window_size+1))].values.reshape(-1, window_size , 1),\n",
    "    test_data.ticker,\n",
    "    test_data.filter(like='month')\n",
    "]\n",
    "y_test = test_data.fwd_returns\n",
    "[x.shape for x in X_test], y_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Define the Model Architecture"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The functional API of Keras makes it easy to design architectures with multiple inputs and outputs. This example illustrates a network with three inputs, as follows:\n",
    "\n",
    "- A two stacked LSTM layers with 25 and 10 units respectively\n",
    "- An embedding layer that learns a 10-dimensional real-valued representation of the equities\n",
    "- A one-hot encoded representation of the month\n",
    "\n",
    "This can be constructed using just a few lines - see e.g., \n",
    "- the [general Keras documentation](https://keras.io/getting-started/sequential-model-guide/), \n",
    "- the [LTSM documentation](https://keras.io/layers/recurrent/).\n",
    "\n",
    "Make sure you are initializing your optimizer given the [keras-recommended approach for RNNs](https://keras.io/optimizers/) \n",
    "\n",
    "We begin by defining the three inputs with their respective shapes, as described here:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:04.225888Z",
     "start_time": "2020-06-22T00:45:04.220741Z"
    }
   },
   "outputs": [],
   "source": [
    "K.clear_session()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:04.233038Z",
     "start_time": "2020-06-22T00:45:04.227661Z"
    }
   },
   "outputs": [],
   "source": [
    "n_features = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:04.250971Z",
     "start_time": "2020-06-22T00:45:04.234559Z"
    }
   },
   "outputs": [],
   "source": [
    "returns = Input(shape=(window_size, n_features), name='Returns')\n",
    "tickers = Input(shape=(1,), name='Tickers')\n",
    "months = Input(shape=(12,), name='Months')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### LSTM Layers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To define stacked LSTM layers, we set the `return_sequences` keyword to `True`. This ensures that the first layer produces an output that conforms to the expected three-dimensional input format. Note that we also use dropout regularization and how the functional API passes the tensor outputs from one layer to the subsequent layer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:04.262374Z",
     "start_time": "2020-06-22T00:45:04.252960Z"
    }
   },
   "outputs": [],
   "source": [
    "lstm1_units = 25\n",
    "lstm2_units = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:05.487085Z",
     "start_time": "2020-06-22T00:45:04.264816Z"
    }
   },
   "outputs": [],
   "source": [
    "lstm1 = LSTM(units=lstm1_units, \n",
    "             input_shape=(window_size, \n",
    "                          n_features), \n",
    "             name='LSTM1', \n",
    "             dropout=.2,\n",
    "             return_sequences=True)(returns)\n",
    "\n",
    "lstm_model = LSTM(units=lstm2_units, \n",
    "             dropout=.2,\n",
    "             name='LSTM2')(lstm1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Embedding Layer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The embedding layer requires the `input_dim` keyword, which defines how many embeddings the layer will learn, the `output_dim` keyword, which defines the size of the embedding, and the `input_length` keyword to set the number of elements passed to the layer (here only one ticker per sample). \n",
    "\n",
    "To combine the embedding layer with the LSTM layer and the months input, we need to reshape (or flatten) it, as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:05.507525Z",
     "start_time": "2020-06-22T00:45:05.488064Z"
    }
   },
   "outputs": [],
   "source": [
    "ticker_embedding = Embedding(input_dim=n_tickers, \n",
    "                             output_dim=5, \n",
    "                             input_length=1)(tickers)\n",
    "ticker_embedding = Reshape(target_shape=(5,))(ticker_embedding)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Concatenate Model components"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can concatenate the three tensors and add fully-connected layers to learn a mapping from these learned time series, ticker, and month indicators to the outcome, a positive or negative return in the following week, as shown here:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:05.582661Z",
     "start_time": "2020-06-22T00:45:05.509449Z"
    }
   },
   "outputs": [],
   "source": [
    "merged = concatenate([lstm_model, \n",
    "                      ticker_embedding, \n",
    "                      months], name='Merged')\n",
    "\n",
    "bn = BatchNormalization()(merged)\n",
    "hidden_dense = Dense(10, name='FC1')(bn)\n",
    "\n",
    "output = Dense(1, name='Output')(hidden_dense)\n",
    "\n",
    "rnn = Model(inputs=[returns, tickers, months], outputs=output)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The summary lays out this slightly more sophisticated architecture with 29,371 parameters, as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:05.596764Z",
     "start_time": "2020-06-22T00:45:05.585277Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "Returns (InputLayer)            [(None, 52, 1)]      0                                            \n",
      "__________________________________________________________________________________________________\n",
      "Tickers (InputLayer)            [(None, 1)]          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "LSTM1 (LSTM)                    (None, 52, 25)       2700        Returns[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "embedding (Embedding)           (None, 1, 5)         12445       Tickers[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "LSTM2 (LSTM)                    (None, 10)           1440        LSTM1[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "reshape (Reshape)               (None, 5)            0           embedding[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "Months (InputLayer)             [(None, 12)]         0                                            \n",
      "__________________________________________________________________________________________________\n",
      "Merged (Concatenate)            (None, 27)           0           LSTM2[0][0]                      \n",
      "                                                                 reshape[0][0]                    \n",
      "                                                                 Months[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "batch_normalization (BatchNorma (None, 27)           108         Merged[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "FC1 (Dense)                     (None, 10)           280         batch_normalization[0][0]        \n",
      "__________________________________________________________________________________________________\n",
      "Output (Dense)                  (None, 1)            11          FC1[0][0]                        \n",
      "==================================================================================================\n",
      "Total params: 16,984\n",
      "Trainable params: 16,930\n",
      "Non-trainable params: 54\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "rnn.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:05.612829Z",
     "start_time": "2020-06-22T00:45:05.599309Z"
    }
   },
   "outputs": [],
   "source": [
    "optimizer =tf.keras.optimizers.Adam()\n",
    "\n",
    "rnn.compile(loss='mse',\n",
    "            optimizer=optimizer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:05.618082Z",
     "start_time": "2020-06-22T00:45:05.614329Z"
    }
   },
   "outputs": [],
   "source": [
    "lstm_path = (results_path / 'lstm.regression.h5').as_posix()\n",
    "\n",
    "checkpointer = ModelCheckpoint(filepath=lstm_path,\n",
    "                               verbose=1,\n",
    "                               monitor='val_loss',\n",
    "                               mode='min',\n",
    "                               save_best_only=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T00:45:05.628079Z",
     "start_time": "2020-06-22T00:45:05.620133Z"
    }
   },
   "outputs": [],
   "source": [
    "early_stopping = EarlyStopping(monitor='val_loss', \n",
    "                              patience=5,\n",
    "                              restore_best_weights=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:17:56.158987Z",
     "start_time": "2020-06-22T00:45:05.631359Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/50\n",
      "16179/16179 [==============================] - ETA: 0s - loss: 0.0117\n",
      "Epoch 00001: val_loss improved from inf to 0.00156, saving model to results/lstm_embeddings/lstm.regression.h5\n",
      "16179/16179 [==============================] - 242s 15ms/step - loss: 0.0117 - val_loss: 0.0016\n",
      "Epoch 2/50\n",
      "16178/16179 [============================>.] - ETA: 0s - loss: 0.0029\n",
      "Epoch 00002: val_loss improved from 0.00156 to 0.00154, saving model to results/lstm_embeddings/lstm.regression.h5\n",
      "16179/16179 [==============================] - 241s 15ms/step - loss: 0.0029 - val_loss: 0.0015\n",
      "Epoch 3/50\n",
      "16177/16179 [============================>.] - ETA: 0s - loss: 0.0029\n",
      "Epoch 00003: val_loss improved from 0.00154 to 0.00154, saving model to results/lstm_embeddings/lstm.regression.h5\n",
      "16179/16179 [==============================] - 249s 15ms/step - loss: 0.0029 - val_loss: 0.0015\n",
      "Epoch 4/50\n",
      "16179/16179 [==============================] - ETA: 0s - loss: 0.0028\n",
      "Epoch 00004: val_loss improved from 0.00154 to 0.00154, saving model to results/lstm_embeddings/lstm.regression.h5\n",
      "16179/16179 [==============================] - 197s 12ms/step - loss: 0.0028 - val_loss: 0.0015\n",
      "Epoch 5/50\n",
      "16179/16179 [==============================] - ETA: 0s - loss: 0.0028\n",
      "Epoch 00005: val_loss improved from 0.00154 to 0.00153, saving model to results/lstm_embeddings/lstm.regression.h5\n",
      "16179/16179 [==============================] - 178s 11ms/step - loss: 0.0028 - val_loss: 0.0015\n",
      "Epoch 6/50\n",
      "16175/16179 [============================>.] - ETA: 0s - loss: 0.0028\n",
      "Epoch 00006: val_loss did not improve from 0.00153\n",
      "16179/16179 [==============================] - 180s 11ms/step - loss: 0.0028 - val_loss: 0.0015\n",
      "Epoch 7/50\n",
      "16178/16179 [============================>.] - ETA: 0s - loss: 0.0028\n",
      "Epoch 00007: val_loss did not improve from 0.00153\n",
      "16179/16179 [==============================] - 170s 10ms/step - loss: 0.0028 - val_loss: 0.0015\n",
      "Epoch 8/50\n",
      "16178/16179 [============================>.] - ETA: 0s - loss: 0.0028\n",
      "Epoch 00008: val_loss did not improve from 0.00153\n",
      "16179/16179 [==============================] - 171s 11ms/step - loss: 0.0028 - val_loss: 0.0015\n",
      "Epoch 9/50\n",
      "16177/16179 [============================>.] - ETA: 0s - loss: 0.0028\n",
      "Epoch 00009: val_loss did not improve from 0.00153\n",
      "16179/16179 [==============================] - 165s 10ms/step - loss: 0.0028 - val_loss: 0.0015\n",
      "Epoch 10/50\n",
      "16179/16179 [==============================] - ETA: 0s - loss: 0.0028\n",
      "Epoch 00010: val_loss did not improve from 0.00153\n",
      "16179/16179 [==============================] - 174s 11ms/step - loss: 0.0028 - val_loss: 0.0015\n"
     ]
    }
   ],
   "source": [
    "training = rnn.fit(X_train,\n",
    "                   y_train,\n",
    "                   epochs=50,\n",
    "                   batch_size=64,\n",
    "                   validation_data=(X_test, y_test),\n",
    "                   callbacks=[early_stopping, checkpointer],\n",
    "                   verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:17:56.167441Z",
     "start_time": "2020-06-22T01:17:56.161588Z"
    }
   },
   "outputs": [],
   "source": [
    "loss_history = pd.DataFrame(training.history)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluate model performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:18:10.701155Z",
     "start_time": "2020-06-22T01:17:56.168851Z"
    }
   },
   "outputs": [],
   "source": [
    "test_predict = pd.Series(rnn.predict(X_test).squeeze(), index=y_test.index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:18:10.706897Z",
     "start_time": "2020-06-22T01:18:10.702372Z"
    }
   },
   "outputs": [],
   "source": [
    "df = y_test.to_frame('ret').assign(y_pred=test_predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:18:11.548766Z",
     "start_time": "2020-06-22T01:18:10.708158Z"
    }
   },
   "outputs": [],
   "source": [
    "by_date = df.groupby(level='date')\n",
    "df['deciles'] = by_date.y_pred.apply(pd.qcut, q=5, labels=False, duplicates='drop')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:18:11.669441Z",
     "start_time": "2020-06-22T01:18:11.550638Z"
    }
   },
   "outputs": [],
   "source": [
    "ic = by_date.apply(lambda x: spearmanr(x.ret, x.y_pred)[0]).mul(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:18:11.681679Z",
     "start_time": "2020-06-22T01:18:11.671092Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "MultiIndex: 131917 entries, ('A', Timestamp('2017-01-01 00:00:00')) to ('ZUMZ', Timestamp('2017-12-31 00:00:00'))\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count   Dtype  \n",
      "---  ------   --------------   -----  \n",
      " 0   ret      131917 non-null  float64\n",
      " 1   y_pred   131917 non-null  float32\n",
      " 2   deciles  131917 non-null  int64  \n",
      "dtypes: float32(1), float64(1), int64(1)\n",
      "memory usage: 3.0+ MB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:18:11.699643Z",
     "start_time": "2020-06-22T01:18:11.683559Z"
    }
   },
   "outputs": [],
   "source": [
    "test_predict = test_predict.to_frame('prediction')\n",
    "test_predict.index.names = ['symbol', 'date']\n",
    "test_predict.to_hdf(results_path / 'predictions.h5', 'predictions')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:18:11.741946Z",
     "start_time": "2020-06-22T01:18:11.701578Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5.10 (0.00%)\n"
     ]
    }
   ],
   "source": [
    "rho, p = spearmanr(df.ret, df.y_pred)\n",
    "print(f'{rho*100:.2f} ({p:.2%})')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T01:18:13.403202Z",
     "start_time": "2020-06-22T01:18:11.743436Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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f1i/fj27du3i/fff55VXXiErK4tPPvmEGjVq8Msvv7Bq1SoiIiLu23ZISAj/93//xxdffMHu3bvp06cPa9euve/4zZ49m1GjRrFjxw6CgoI4duwYP//8M8HBwXz66ad88803fP/990U+tb5w4QINGzYscDHM17Vr11JXIzt9+jTvvvsue/bs4bHHHmP9+vU89thjjBs3jsGDB/P6668Xul5xvx0hxMNl/vz5jB07lhYtWhS7XI8ePTh16hTwd4L4xBNPEBoaSnJyMhcuXKBp06a4urqya9curl27xvbt2/nhhx/o2bMn77zzDmB88N26dWt27NjBrl27SElJ4auvvjLt5/bt2zz77LO88MILTJw4sdBY8q+tAwcOpFOnTrz22mtMmTKFQYMGkZeXx/Tp0wkICGD37t1s2LCBjz/+2PRQtiSFnTcB3nzzTYYMGcKePXt45513OH/+fInbunz5Mr6+vvdNb926Ne3atTMrnnzdu3c3PSDJP/69evW6794HKPJaZM65fc+ePXz66ads3rzZVDMCoH79+nTq1Ikff/wRMNaWcHZ25pFHHikQ56FDh6hZsyaBgYH8+uuvtGnThm+//RYvLy+aNWtmivfIkSN4enri4+NT7LH94IMPGD9+fKHH5OOPP6Zbt24lHjsbGxu++eYbevXqRUpKCv369QOMybSVlRUBAQGMGzeO0aNHU7t27RK3l+/ChQt4e3ubHgzdrUuXLpw9e5auXbuSmZlpeti/Z88eevbsSa1atYr8nKDgPVdubi7Hjh1j8+bN7N69m9dff51PPvmk2Ng2bNhQaO24zMxMOnbsyKpVqwgKCiIuLo4VK1YUuo3//ve/9z38SElJQa/Xm2ovAtSpU4dbt24Vf7BEhZEq7sIi5T/Fd3V1pUuXLiiVSnr37s23335L3759USgU+Pj4cPDgQRISEgq021IoFFy9epXTp08TGRlZoCQ8PT3d1L5u48aNJCUlsWvXrvsSb1tbW8aMGcP27dt566232LlzJ5s3by401qKquPfr149t27YxfPhwU0nBsWPHqFWrFt27dyczM5OrV68yfPhwAB5//PFin7bnV3HXarW8//77hIaGmto437hxg6ioKN5++23T8tnZ2fz111+lukGwtrYusLyNjY3pZuDuton9+vXjrbfe4uLFi3Tu3Jl33nkHpfL+5301a9Zk8ODB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7s+8MMX9doQQD4+goCD27NnDDz/8wPr1603Xijp16vDDDz+Y/j366KPA352VdejQwfTgumfPnhw/fpy4uDhatWoFYGr+pFarAVi1ahVvvvmmad7GjRsxGAxotVqmT59eoDSzXbt2LFu2jLVr15p93VuwYAFHjx7l999/x9vbG2tra/bu3QsYE9Bff/2VLl26lPk4qVQqfH19Te2ib968yfHjx+97EHCv/v37o1ar2bBhgykRvXnzJsuWLSvwgNccTk5ONGnShC1bthTot6ZXr16sW7fOVDhR3LWopHN7kyZN6Ny5MwEBAbz11lv3NU9TKBRMmDCBefPm4efnV2h77SNHjpiSUS8vL/bv329673Z2dgwZMoQ5c+bQv39/7O3ty3xszRUSEsLcuXNNNTh27dplKqHfunWr6buXkZHBvn37SlV6X6dOHQICAnjjjTcKXB+///579u7dy7Rp00zLtW3blvnz5zN69Gig+M/pXqdPn6ZNmzY899xzdOjQgX379pmOaWndunWLDz/8kOzsbHQ6HRs3bixQMFQSa2trevXqZWqKGBISQlhYmFm1U0TFkBJ0YZHs7e1p0qQJubm5BUqBe/bsyfLly00nCRcXFz755BM++ugjcnJyMBgMfPTRR3h6euLp6cm0adOYMmUKCoUClUrFp59+WuCCoFAoWLJkCcOHDzcl/XcbOXIk77//fqHzzNGvXz/27t1Lp06dqFGjBo888gi1atUyXfA+/vhj5s6dy7Zt22jUqFGBtmAleeKJJ/D392fRokVs3bqVNWvW8MEHH/DFF1+Ql5fHa6+9xuOPPw4Yq6MFBASwevVq/v3vf/Pee+8RGBhI69atad26danf14wZM5g3bx6BgYFYWVnRt29f05Pau7m6urJ3715WrlyJvb09q1evNj3FzT8WZemNtzBNmzZl0aJFvPHGG6anxWvXrsXR0ZFXXnmFBQsWMGjQIFxcXGjevPl967do0YLZs2fz/PPPA+Du7m5qc3/38fu///s/3n//fVPHdH5+fgwdOhQwtgmcPHkyjo6OxT50mDVrFtu3b2f69Onk5OSYajG4ubmxd+9epk6dyvTp05kzZw4HDx7E29vbVJJlrk6dOvHvf/+b999/v9DPuLjfjhDin6tHjx7MmzevQMm2m5sbDg4OtGvXznQNHTNmDLdv3+bpp59GoVBQr149li1b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uogTqUAXEREREXkBeHl5YTKZ+P7774mLi+PChQtcv34df39/hgwZwoIFC8jKysLPz48qVaowefJkAEqVKsXUqVMpUaKEk7dApPDTPegiIiIiIi+IsmXLcvjwYRo3bszixYuJj48nPj4ed3d3wsLC6NatG23btiUiIoLx48cTGxuLv78/ixYtcnZ0kReCetBFRERERF4Q6enp+Pn5ceDAAVJSUvD29iY7O/uh+Y4fP86ECRMAyMnJwdfXt6CjiryQVKCLiIiIiLwAMjIySExMJCgoiLt37zJx4kROnz7NqlWrsFqtuLm5YbFYAPD19WX69OlUrlyZ3bt3c/nyZSenF3kxqEAXERERESmkUlJSMJvNuLm5kZeXx5AhQ/D19WXYsGHs3r0bT09PqlevzqVLl6hTpw4xMTE0bNiQqKgoRo0aRV5eHgBTpkxx8paIvBgMVqvV6uwQIiIiIiIiIi86PSRORERERERExAWoQBcRERERERFxASrQRURERERERFyACnQRERERERERF6ACXURERERERMQFqEAXERERERERcQEq0EVERERERERcwP8DQTeSRKs5VgwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1008x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(ncols=2, figsize=(14,4))\n",
    "sns.barplot(x='deciles', y='ret', data=df, ax=axes[0])\n",
    "axes[0].set_title('Weekly Fwd Returns by Predicted Quintile')\n",
    "axes[0].yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.2%}'.format(y))) \n",
    "axes[0].set_ylabel('Weekly Returns')\n",
    "axes[0].set_xlabel('Quintiles')\n",
    "\n",
    "avg_ic = ic.mean()\n",
    "title = f'4-Week Rolling IC | Weekly avg: {avg_ic:.2f} | Overall: {rho*100:.2f}'\n",
    "ic.rolling(4).mean().dropna().plot(ax=axes[1], title=title)\n",
    "axes[1].axhline(avg_ic, ls='--', c='k', lw=1)\n",
    "axes[1].axhline(0, c='k', lw=1)\n",
    "axes[1].set_ylabel('IC')\n",
    "axes[1].set_xlabel('Date')\n",
    "\n",
    "sns.despine()\n",
    "fig.tight_layout()\n",
    "fig.savefig(results_path / 'lstm_reg');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda env:ml4t-dl]",
   "language": "python",
   "name": "conda-env-ml4t-dl-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
